Gunicorn Worker Types

2017 11 16일 목요일

오후 1:32

링크: https://www.spirulasystems.com/blog/2015/01/20/gunicorn-worker-types/

 

Gunicorn

 

- 간결, 강력한 파이썬 WSGI (Web Server Gateway Interface) HTTP server 이다.

- pre-fork 모델 서버이다.

- master process 가 시작하고

- worker process 들이 master 에서 fork 된다.

* worker request handling 하고 response를 돌려준다

 

worker types

- worker-class 옵션으로 worker type을 설정할 수 있다.

- 옵션값은 sync, gevent, eventlet, tornado, gaiohttp, gthread 를 줄 수 있다.

- Sync, Async, Tornado, AsyncIO type을 지원하며 default Sync 이다

 

Sync Workers

 

- Gunicorn default worker type

- 각각의 worker는 한번에 하나의 request를 처리한다 (Apache webserver prefork mpm model과 유사)

- disk I/O 와 같은 external request가 필요없는 어플리케이션에서 사용한다

- 하나의 request가 처리되는 동안, 다음 request는 기다려야 하고, 결국 timeout 이 걸리면 fail

 

sync_worker_type1

 

 

Async Workers

 

- 동시성 (Concurrency)을 지원한다 = 하나 이상의 request 를 처리할 수 있다.

- Gevent 또는 Eventlet 으로 다시 나눌수 있다.

- 둘 다 Greenlet library에서 나온 것이며, Greenlet coroutines를 파이썬으로 구현한 것

- 둘 다 green threads 를 사용한다. = program level threads (not OS level)

- 어플리케이션에서 별도로 해줄 것은 없다

 

아래 그림을 보며 위 Sync Worker와 비교해보자

- Sync: 만약 External I/O 작업을 한다면, 작업 회신이 올때까지 Worker는 놀면서 기다리는 거다

- Async: External I/O 작업을 지시해놓고, 완료되면 알려달라고 한 다음에 그 다음 Request를 수행하는 거다

 

 

Tornado Workers

 

Tornado python framework 와 연동하기 위해 디자인되었다.

- 다른 python framework 로는 Flask, Django 등이 있음

- Async I/O non-blocking design model 을 제공한다

- 한 줄 요약하자면 Tornado framework 특화된 Async worker

- 다른 framework에 붙여도 되지만 굳이 그러진 말자

 

 

 

AsyncIO Workers

 

- gthread gaiohttp로 나눌 수 있다.

- gaiohttp

- aiohttp library를 사용. client / server 양쪽의 asynchronous I/O networking 을 구현해 둔 라이브러리임

- web socket을 지원함

- gthread

- full threaded worker

- thread pool에는 (여러 thread 중 하나가 처리할) 이벤트를 기다리면서 항상 연결되어 있다.

 

결론

 

어떤 Worker type을 쓸 것인가는 어플리케이션의 성격에 달려있다.

- CPU bounded or external I/O bounded - , CPU를 많이 쓰는가, external I/O를 많이 쓰는가

 

Microsoft OneNote 2016에서 작성